// 列表, 模板进阶操作.
package main

import (
	_ "embed"
	"fmt"
	app "gitee.com/go_888/xcgui/xcgui/app"
	widget "gitee.com/go_888/xcgui/xcgui/widget"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

var (
	//go:embed list2/list2.zip
	zipData []byte

	a  *app.X结构_全局API
	w  *window.Window
	ls *widget.X结构_列表
)

func main() {
	a = app.X创建(true)
	a.X启用DPI(true)
	a.X启用自动DPI(true)
	// 从内存zip加载资源文件
	a.X加载资源文件内存zip(zipData, "resource.res", "")
	w = window.X创建窗口(0, 0, 302, 308, "列表, 模板进阶操作", 0, xcc.X窗口样式_默认样式)

	// 创建List
	ls = widget.X创建列表(10, 33, 282, 263, w.X句柄)

	// List的模板得设置两遍, 一遍是列表头, 一遍是列表项
	var hTemp int
	if hTemp = xc.X模板_加载从内存zip(xcc.X列表项模板类型_列表头, zipData, "tmpl_list.xml", ""); hTemp == 0 {
		panic("ListItemTemp_Type_List_Head: hTemp==0")
	}
	ls.X设置项模板(hTemp)

	if hTemp = xc.X模板_加载从内存zip(xcc.X列表项模板类型_列表项, zipData, "tmpl_list.xml", ""); hTemp == 0 {
		panic("ListItemTemp_Type_List_Item: hTemp==0")
	}
	ls.X设置项模板(hTemp)

	// 创建表头数据适配器
	ls.X创建列表头数据适配器()
	// 创建数据适配器: 2列
	ls.X创建数据适配器(2)
	// 列表_置项默认高度
	ls.X设置行默认高度(28, 28)

	// 添加列
	ls.X添加列文本(68, "name1", "状态")
	ls.X添加列文本(192, "name2", "操作")

	// 循环添加数据
	for i := 0; i < 8; i++ {
		// 添加行
		index := ls.X添加行文本("")
		// 置行数据
		ls.X设置项文本(index, 1, "")
	}

	// 列表_项模板创建完成事件
	ls.X事件_项模板创建完成(onLIST_TEMP_CREATE_END)

	w.X显示方式(xcc.SW_SHOW)
	a.X运行()
	a.X退出()
}

// 项模板创建完成事件. 在此事件中获取按钮并注册事件
func onLIST_TEMP_CREATE_END(pItem *xc.X结构_列表项, nFlag int32, pbHandled *bool) int {
	// 只在创建新模板实例的时候, 给按钮注册事件, 这样是为了避免重复注册事件
	if nFlag == 1 { // 0:状态改变(复用); 1:新模板实例; 2:旧模板复用
		hBtn := ls.X取项模板对象(pItem.Index, 0, 2) // 前两个参数是项索引和列索引, 第三个参数是项模板里按钮的itemID, 在设计器里是可以自己填的, 必须填了, 这里才能获取
		fmt.Println(xc.X按钮_取文本(hBtn))
		// 注册按钮事件
		xc.X元素_注册事件C1(hBtn, xcc.X元素事件_按钮_点击, onBnClick)

		// 项模板里按钮的itemID是2,3,4
		for i := int32(2); i < 5; i++ {
			hBtn = ls.X取项模板对象(pItem.Index, 1, i)
			fmt.Println(xc.X按钮_取文本(hBtn))
			xc.X元素_注册事件C1(hBtn, xcc.X元素事件_按钮_点击, onBnClick)
			// 把按钮所在列索引存进去, 可能会用到, 用不到就不存
			xc.X元素_设置用户数据(hBtn, 1)
		}
	}
	return 0
}

// 按钮事件
func onBnClick(hEle int, pbHandled *bool) int {
	// 获取按钮所在的行索引
	row := ls.X取对象所在行(hEle)
	// 获取按钮所在的列索引
	col := xc.X元素_取用户数据(hEle)

	xc.X消息框("提示", fmt.Sprintf("你点击了按钮: %s, 行: %d, 列: %d", xc.X按钮_取文本(hEle), row, col), xcc.X消息框_确定按钮, w.X取HWND句柄(), xcc.X窗口样式_默认样式)
	return 0
}
